package org.zxp.designpattern.singleton;

/**
 * @program: effectiveJava
 * @description: 懒汉 线程安全（高性能）double check
 * @author: X-Pacific zhang
 * @create: 2019-08-21 21:26
 **/
public class Singleton4 {
    private volatile static Singleton4 INSTANCE;

    private Singleton4(){}

    /**
     * '为什么说这种double check性能比较好
     * @return
     */
    public static Singleton4 getInstance(){//1 整个方法不用上锁
        if(INSTANCE == null){//这里有一道没有上锁的判断
            synchronized (Singleton4.class){//并发争抢锁
                if(INSTANCE == null){//第一个抢到的会new，后面的直接返回了
                    INSTANCE = new Singleton4();
                }
            }
        }
        return INSTANCE;//如果INSTANCE不是volatile的，那么将无法保证jvm不会指令重写，可能返回一个虽然不是null但实际是空值的对象（需要看字节码是怎样的）
        //至于不是double check的就是错误的写法，如果高并发进来可能get到两个不同的实例
    }
}
